/**
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
示例 1：
输入：height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出：6
解释：上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图，在这种情况下，可以接 6 个单位的雨水（蓝色部分表示雨水）。
示例 2：
输入：height = [4,2,0,3,2,5]
输出：9
 */
function trap(height) {
  let left = 0
  let right = height.length - 1
  let leftMax = 0
  let rightMax = 0
  let res = 0
  while(left < right) {
    leftMax = Math.max(leftMax, height[left])
    rightMax = Math.max(rightMax, height[right])
    res += leftMax < rightMax ? leftMax - height[left++] : rightMax - height[right--]
  }
  return res
}
const height = [0,1,0,2,1,0,1,3,2,1,2,1]
console.log(trap(height))
/**
idea: 双指针，left从数组开头开始，right从数组末尾开始，计算两个指针之间的面积，更新最大面积
leftMax记录left左边的最大高度，rightMax记录right右边的最大高度
res记录雨水量
如果leftMax < rightMax，则left右移，否则right左移 res加上leftMax - height[left] 原因是leftMax是left左边的最大高度，height[left]是当前高度，所以leftMax - height[left]是当前位置的雨水量
如果leftMax > rightMax，则right左移，否则left右移 res加上rightMax - height[right] 原因是rightMax是right右边的最大高度，height[right]是当前高度，所以rightMax - height[right]是当前位置的雨水量
最后返回雨水量
 */